/* Autore: Nicola Agosti */
/*
Sviluppare un'algoritmo che permetta di riempire un vettore di N elementi interi (al massimo 50)
con numeri compresi fra 0 e 100 (inclusi) in modo casuale (random) e senza che vi siano ripetizioni.
*/

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

/* "Attivo" le funzioni standard per la manipolazione del tempo che mi 
serviranno per inizializzare la funzione che genera i numeri (pseudo)casuali */
#include <time.h> 

#define MAX_VAL 100 /* Valore massimo che può assumere un numero nel vettore */
#define MAX_ELEM 50 /* Numero massimo di elementi presenti nel vettore */

/* Definisco due costanti per semplificare la gestione del flag "trovatoDuplicato"*/
#define VERO 1
#define FALSO 0

int main()
{
	int numeri[MAX_ELEM], nuovoNumero;
	int elemDaGenerare, i, j;
	int trovatoDuplicato; /* Variabile che utilizzerò come flag */

	/* Inizializzo la funzione che genera i numero (pseudo) casuali - Vedi
	il file "Risorse in italiano\Libro\rand.pdf" su Teams */
	srand(time(NULL));

	/* Chiedo all'utente quanti elementi vuole generare */
	printf("Quanti elementi vuoi generare\? ");
	scanf("%d", &elemDaGenerare);

	/* Controllo che l'utente abbia inserito un valore tra 1 e MAX_ELEM */
	if (elemDaGenerare >= 1 && elemDaGenerare <= MAX_ELEM)
	{
		/* Genero i numeri necessari a "riempire" il vettore */
		i = 0;
		while (i < elemDaGenerare)
		{
			/* Genero un numero intero casuale tra 0 e MAX_VAL */
			nuovoNumero = rand() % (MAX_VAL + 1);

			/* Controllo che il numero non sia già presente nel vettore */
			trovatoDuplicato = FALSO;
			j = 0;
			while (j < i)
			{
				/* Verifico se "nuovoNumero" è uguale all'elemento attuale del vettore */
				if (nuovoNumero == numeri[j])
				{
					/* "nuovoNumero" è già presente nel vettore */
					/* Setto il flag "trovatoDuplicato" a VERO */
					trovatoDuplicato = VERO;
				}
				
				j++;
			}

			/* Se "nuovoNumero" è già presente nel vettore NON incremento "i" 
			in modo da tentare di riempire l'elemento i-esimo con un nuovo numero */
			if (trovatoDuplicato == FALSO)
			{
				/* Il numero generato è valido, lo memorizzo nel vettore e passo all'elemento successivo */
				numeri[i] = nuovoNumero;
				i++;
			}
		}

		/* Visualizzo i numeri generati */
		printf("\nNumeri univoci generati: ");
		i = 0;
		while (i < elemDaGenerare)
		{
			printf("%d ", numeri[i]);
			i++;
		}
	}
	else
	{
		/* Errore */
		printf("\nIl valore inserito non e\' valido!");
	}

	return 0;
}